<!DOCTYPE html>
<html  lang="zh-CN" >
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, minimum-scale=1, initial-scale=1, maximum-scale=5, viewport-fit=cover">
    <title>ESP-IDF学习笔记-错误处理 | LO_StacNet的火柴盒</title>
    <meta name="description" content="ESP-IDF学习笔记-错误处理同STM32HAL库的各种错误状态码一样，ESP-IDF中也有不同的错误码以及相应的错误处理方法，这给出基本的使用。">
<meta property="og:type" content="article">
<meta property="og:title" content="ESP-IDF学习笔记-错误处理">
<meta property="og:url" content="https://lostacnet.top/post/42118/">
<meta property="og:site_name" content="LO_StacNet的火柴盒">
<meta property="og:description" content="ESP-IDF学习笔记-错误处理同STM32HAL库的各种错误状态码一样，ESP-IDF中也有不同的错误码以及相应的错误处理方法，这给出基本的使用。">
<meta property="og:locale" content="zh_CN">
<meta property="article:published_time" content="2023-04-20T17:18:45.000Z">
<meta property="article:modified_time" content="2024-02-09T14:14:37.341Z">
<meta property="article:author" content="LO_StacNet">
<meta property="article:tag" content="ESP-IDF">
<meta property="article:tag" content="ESP32">
<meta name="twitter:card" content="summary">

    
    <link rel="icon" href="/images/favicon.ico" type="image/x-icon">

    
<link rel="stylesheet" href="/css/common.min.css">



    
        <link href="//cdn.jsdelivr.net/npm/katex@0.9.0/dist/katex.min.css" rel="stylesheet">
    
    
    
    
        <link href="//cdn.jsdelivr.net/npm/lightgallery.js@1.1.3/dist/css/lightgallery.min.css" rel="stylesheet">
    
    
    
<link rel="stylesheet" href="/css/iconfont.min.css">

    
<meta name="generator" content="Hexo 6.3.0"><style>mjx-container[jax="SVG"] {
  direction: ltr;
}

mjx-container[jax="SVG"] > svg {
  overflow: visible;
}

mjx-container[jax="SVG"][display="true"] {
  display: block;
  text-align: center;
  margin: 1em 0;
}

mjx-container[jax="SVG"][justify="left"] {
  text-align: left;
}

mjx-container[jax="SVG"][justify="right"] {
  text-align: right;
}

g[data-mml-node="merror"] > g {
  fill: red;
  stroke: red;
}

g[data-mml-node="merror"] > rect[data-background] {
  fill: yellow;
  stroke: none;
}

g[data-mml-node="mtable"] > line[data-line] {
  stroke-width: 70px;
  fill: none;
}

g[data-mml-node="mtable"] > rect[data-frame] {
  stroke-width: 70px;
  fill: none;
}

g[data-mml-node="mtable"] > .mjx-dashed {
  stroke-dasharray: 140;
}

g[data-mml-node="mtable"] > .mjx-dotted {
  stroke-linecap: round;
  stroke-dasharray: 0,140;
}

g[data-mml-node="mtable"] > svg {
  overflow: visible;
}

[jax="SVG"] mjx-tool {
  display: inline-block;
  position: relative;
  width: 0;
  height: 0;
}

[jax="SVG"] mjx-tool > mjx-tip {
  position: absolute;
  top: 0;
  left: 0;
}

mjx-tool > mjx-tip {
  display: inline-block;
  padding: .2em;
  border: 1px solid #888;
  font-size: 70%;
  background-color: #F8F8F8;
  color: black;
  box-shadow: 2px 2px 5px #AAAAAA;
}

g[data-mml-node="maction"][data-toggle] {
  cursor: pointer;
}

mjx-status {
  display: block;
  position: fixed;
  left: 1em;
  bottom: 1em;
  min-width: 25%;
  padding: .2em .4em;
  border: 1px solid #888;
  font-size: 90%;
  background-color: #F8F8F8;
  color: black;
}

foreignObject[data-mjx-xml] {
  font-family: initial;
  line-height: normal;
  overflow: visible;
}

.MathJax path {
  stroke-width: 3;
}

mjx-container[display="true"] {
  overflow: auto hidden;
}

mjx-container[display="true"] + br {
  display: none;
}
</style></head>

    <body>
        <header class="header header-fixture">
    <div class="profile-search-wrap flex sm:block">
        
        
        <div class="profile sm:text-center md:px-1 lg:px-3 sm:pb-4 sm:pt-6">
            <a id="avatar" role="link" href="http://www.lostacnet.top" class="inline-block lg:w-16 lg:h-16 w-8 h-8 m-2" target="_blank" rel="noopener" rel="noreferrer" >
                <img src="/images/avatar.jpg" class="rounded-full" alt="avatar">
            </a>
            <h2 id="name" class="hidden lg:block">LO_StacNet</h2>
            <h3 id="title" class="hidden lg:block">电子玩家 &amp; 理想主义</h3>
            
            <small id="location" class="hidden lg:block">
                <i class="iconfont icon-map-icon"></i>
                Sichuan, China
            </small>
            
        </div>
        
        
<div class="search flex-1 flex lg:inline-block sm:hidden lg:px-4 lg:mt-2 lg:mb-4 lg:w-full">
    <form id="search-form" class="my-auto flex-1 lg:border lg:border-solid lg:border-gray-200">
        <div class="input-group table bg-gray-100 lg:bg-white w-full">
            <input id="search-input" type="text" placeholder="搜索" class="inline-block w-full bg-gray-100 lg:bg-white p-1">
            <span class="table-cell">
                <button name="search tigger button" disabled>
                    <i class="iconfont icon-search m-2"></i>
                </button>
            </span>
        </div>
    </form>
        
<div id="content-json" data-placeholder="搜索" class="invisible hidden">/content.json</div>
<script id="search-teamplate" type="text/html" data-path="/content.json">
    <div>
        <div class="search-header bg-gray-400">
            <input id="actual-search-input" model="keyword" ref="input" class="inline-block w-full h-10 px-2 py-1" placeholder="搜索" type="text">
        </div>
        <div class="search-result bg-gray-200">
            {{#each searchPosts}}
            <a href="/{{ path }}" class="result-item block px-2 pb-3 mb-1 pt-1 hover:bg-indigo-100">
                <i class="iconfont icon-file"></i>
                <h1 class="result-title inline font-medium text-lg">{{ title }}</h1>
                <p class="result-content text-gray-600 text-sm">{{{ text }}}</p>
            </a>
            {{/each}}
        </div>
    </div>
</script>

</div>


        <button name="menu toogle button" id="menu-toggle-btn" class="block sm:hidden p-3" role="button" aria-expanded="false">
            <i class="iconfont icon-hamburger"></i>
        </button>
    </div>
    <nav id="menu-nav" class="hidden sm:flex flex-col">
        
        
            <div class="menu-item menu-home" role="menuitem">
                <a href="/.">
                    <i class="iconfont icon-home" aria-hidden="true"></i>
                    <span class="menu-title">首页</span>
                </a>
            </div>
        
        
            <div class="menu-item menu-archives" role="menuitem">
                <a href="/archives">
                    <i class="iconfont icon-archive" aria-hidden="true"></i>
                    <span class="menu-title">归档</span>
                </a>
            </div>
        
        
            <div class="menu-item menu-categories" role="menuitem">
                <a href="/categories">
                    <i class="iconfont icon-folder" aria-hidden="true"></i>
                    <span class="menu-title">分类</span>
                </a>
            </div>
        
        
            <div class="menu-item menu-tags" role="menuitem">
                <a href="/tags">
                    <i class="iconfont icon-tag" aria-hidden="true"></i>
                    <span class="menu-title">标签</span>
                </a>
            </div>
        
        
            <div class="menu-item menu-links" role="menuitem">
                <a href="/links">
                    <i class="iconfont icon-friend" aria-hidden="true"></i>
                    <span class="menu-title">友链</span>
                </a>
            </div>
        
        
            <div class="menu-item menu-about" role="menuitem">
                <a href="/about">
                    <i class="iconfont icon-cup" aria-hidden="true"></i>
                    <span class="menu-title">关于</span>
                </a>
            </div>
        
        
<div class="social-links flex sm:flex-col lg:hidden mt-5">
    
        <span class="social-item text-center">
            <a target="_blank" rel="noopener" href="https://github.com/LOStacNet">
                <i class="iconfont social-icon icon-github"></i>
                <span class="menu-title hidden lg:inline">menu.github</span>
            </a>
        </span>
    
        <span class="social-item text-center">
            <a target="_blank" rel="noopener" href="https://gitee.com/LOStacNet">
                <i class="iconfont social-icon icon-project"></i>
                <span class="menu-title hidden lg:inline">menu.project</span>
            </a>
        </span>
    
</div>


    </nav>
</header>

        <section class="main-section">
            
    <main class="flex-1 px-4 py-14 md:px-5 lg:px-8 lg:py-4 relative min-h-screen">
    

    <article class="content article article-archives article-type-list" itemscope="">
        <header class="article-header">
            
    
        <h1 class="article-title text-lg" itemprop="name">
            ESP-IDF学习笔记-错误处理
        </h1>
    



            <p class="article-meta mb-3 text-xs">
                <span class="article-date">
    <i class="iconfont icon-calendar-check"></i>
	<a href="/post/42118/" class="article-date">
	  <time datetime="2023-04-20T17:18:45.000Z" itemprop="datePublished">4月 21</time>
	</a>
</span>

                
    <span class="article-category">
    <i class="iconfont icon-folder"></i>
    <a class="article-category-link" href="/categories/ESP32%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/">ESP32学习笔记</a>
  </span>


                
    <span class="article-tags">
    <i class="iconfont icon-tag"></i>
    <a class="article-tag-none-link" href="/tags/ESP-IDF/" rel="tag">ESP-IDF</a>, <a class="article-tag-none-link" href="/tags/ESP32/" rel="tag">ESP32</a>
  </span>


                <span class="_partial/post-comment"><i class="icon icon-comment"></i>
                    <a href="/post/42118/#comments" class="article-comment-link">
                        评论
                    </a>
                </span>
                
    
        <span class="post-wordcount" itemprop="wordCount">字数统计: 1.1k(字)</span>
    
    
        <span class="post-readcount" itemprop="timeRequired">阅读时长: 4(分)</span>
    


            </p>
        </header>
        <div class="marked-body article-body">
            <h1 id="ESP-IDF学习笔记-错误处理"><a href="#ESP-IDF学习笔记-错误处理" class="headerlink" title="ESP-IDF学习笔记-错误处理"></a>ESP-IDF学习笔记-错误处理</h1><p>同STM32HAL库的各种错误状态码一样，ESP-IDF中也有不同的错误码以及相应的错误处理方法，这给出基本的使用。</p>
<span id="more"></span>

<p>首先放上<a target="_blank" rel="noopener" href="https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32s3/api-guides/error-handling.html">官方文档</a></p>
<h2 id="一，错误的分类"><a href="#一，错误的分类" class="headerlink" title="一，错误的分类"></a>一，错误的分类</h2><p>ESP32中主要有两类错误：</p>
<ol>
<li>可恢复错误</li>
</ol>
<p>可用<a target="_blank" rel="noopener" href="https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32s3/api-reference/error-codes.html">错误状态码</a>表示，使用 <code>throw</code> 关键字抛出的 C++ 异常。</p>
<ol start="2">
<li>不可恢复（严重）错误</li>
</ol>
<p>断言失败：（使用 <code>assert</code> 宏或者其它类似方法，可参考 <a target="_blank" rel="noopener" href="https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32s3/contribute/style-guide.html#assertions">Assertions</a>）或者直接调用 <code>abort()</code> 函数造成的错误</p>
<p>CPU 异常：访问受保护的内存区域、非法指令等</p>
<p>系统级检查：看门狗超时、缓存访问错误、堆栈溢出、堆栈粉碎、堆栈损坏等</p>
<h2 id="二，错误码与错误消息"><a href="#二，错误码与错误消息" class="headerlink" title="二，错误码与错误消息"></a>二，错误码与错误消息</h2><p>在ESP-IDF中，错误码的类型是<code>esp_err_t</code>，本质是带符号整型。其中表示没有错误的定义是：<code>ESP_OK</code>具体定义为0。</p>
<p>对于一个具体的错误，错误码常常以<code>ESP_ERR_XXX</code>形式呈现，常见的错误码在<code>esp_err.h</code>中已经定义好了，各个组件也可以自定义。</p>
<p>得到整型的错误码可以使用<code>esp_err_to_name()</code>或者<code>esp_err_to_name_r()</code>函数(<code>esp_err.h</code>)将其转换为字符串(返回值是<code>const char *</code>)，这两个函数的区别主要在于当没有匹配的错误时，是否用 <a target="_blank" rel="noopener" href="https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html">标准 POSIX 错误代码</a> 进行解释。</p>
<h2 id="三，常用宏"><a href="#三，常用宏" class="headerlink" title="三，常用宏"></a>三，常用宏</h2><ul>
<li>ESP_ERROR_CHECK</li>
</ul>
<p>该宏定义在<code>esp_err.h</code>中。功能与<code>assert</code>相似，但是会检测错误值并打印错误信息，最后调用<code>abort()</code>。</p>
<p>通常错误信息如下:</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">ESP_ERROR_CHECK failed: esp_err_t 0x107 (ESP_ERR_TIMEOUT) at 0x400d1fdf</span><br><span class="line"></span><br><span class="line">file: "/Users/user/esp/example/main/main.c" line 20</span><br><span class="line">func: app_main</span><br><span class="line">expression: sdmmc_card_init(host, &amp;card)</span><br><span class="line"></span><br><span class="line">Backtrace: 0x40086e7c:0x3ffb4ff0 0x40087328:0x3ffb5010 0x400d1fdf:0x3ffb5030 0x400d0816:0x3ffb5050</span><br></pre></td></tr></table></figure>

<ul>
<li>ESP_ERROR_CHECK_WITHOUT_ABORT</li>
</ul>
<p>该宏定义在<code>esp_err.h</code>中。功能与ESP_ERROR_CHECK一样，但不会调用<code>abort()</code>。</p>
<p>以下宏定义在<code>esp_check.h</code></p>
<ul>
<li>ESP_RETURN_ON_ERROR</li>
</ul>
<p>宏 ESP_RETURN_ON_ERROR 用于错误码检查, 如果错误码不等于 ESP_OK, 该宏会打印错误信息，并使原函数立刻返回。</p>
<ul>
<li>ESP_GOTO_ON_ERROR</li>
</ul>
<p>宏 ESP_GOTO_ON_ERROR 用于错误码检查, 如果错误码不等于 ESP_OK, 该宏会打印错误信息，将局部变量 ret 赋值为该错误码, 并使原函数跳转至给定的 goto_tag.</p>
<ul>
<li>ESP_RETURN_ON_FALSE</li>
</ul>
<p>宏 ESP_RETURN_ON_FALSE 用于条件检查, 如果给定条件不等于 true, 该宏会打印错误信息，并使原函数立刻返回，返回值为给定的 err_code.</p>
<ul>
<li>ESP_GOTO_ON_FALSE</li>
</ul>
<p>宏 ESP_GOTO_ON_FALSE 用于条件检查, 如果给定条件不等于 true, 该宏会打印错误信息，将局部变量 ret 赋值为给定的 err_code, 并使原函数跳转至给定的 goto_tag.</p>
<blockquote>
<p>ESP_RETURN_xx 和 ESP_GOTO_xx 宏不可以在中断服务程序里被调用。</p>
</blockquote>
<p>使用例:</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">static</span> <span class="type">const</span> <span class="type">char</span>* TAG = <span class="string">"Test"</span>;</span><br><span class="line"></span><br><span class="line"><span class="type">esp_err_t</span> <span class="title function_">test_func</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">{</span><br><span class="line">    <span class="type">esp_err_t</span> ret = ESP_OK;</span><br><span class="line"></span><br><span class="line">    ESP_ERROR_CHECK(x);                                         <span class="comment">// err message printed if `x` is not `ESP_OK`, and then `abort()`.</span></span><br><span class="line">    ESP_ERROR_CHECK_WITHOUT_ABORT(x);                           <span class="comment">// err message printed if `x` is not `ESP_OK`, without `abort()`.</span></span><br><span class="line">    ESP_RETURN_ON_ERROR(x, TAG, <span class="string">"fail reason 1"</span>);               <span class="comment">// err message printed if `x` is not `ESP_OK`, and then function returns with code `x`.</span></span><br><span class="line">    ESP_GOTO_ON_ERROR(x, err, TAG, <span class="string">"fail reason 2"</span>);            <span class="comment">// err message printed if `x` is not `ESP_OK`, `ret` is set to `x`, and then jumps to `err`.</span></span><br><span class="line">    ESP_RETURN_ON_FALSE(a, err_code, TAG, <span class="string">"fail reason 3"</span>);     <span class="comment">// err message printed if `a` is not `true`, and then function returns with code `err_code`.</span></span><br><span class="line">    ESP_GOTO_ON_FALSE(a, err_code, err, TAG, <span class="string">"fail reason 4"</span>);  <span class="comment">// err message printed if `a` is not `true`, `ret` is set to `err_code`, and then jumps to `err`.</span></span><br><span class="line"></span><br><span class="line">err:</span><br><span class="line">    <span class="comment">// clean up</span></span><br><span class="line">    <span class="keyword">return</span> ret;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>

<blockquote>
<p>如果 Kconfig 中的 CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT 选项被打开, CHECK 宏将不会打印错误信息，其他功能不变。</p>
</blockquote>
<h2 id="四，错误处理"><a href="#四，错误处理" class="headerlink" title="四，错误处理"></a>四，错误处理</h2><h3 id="根据错误码恢复"><a href="#根据错误码恢复" class="headerlink" title="根据错误码恢复"></a>根据错误码恢复</h3><p>用变量储存错误码，在代码中判断错误码类型，根据类型不同尝试恢复。或者使用上面用到的CHECK宏。</p>
<h3 id="转化为不可恢复错误"><a href="#转化为不可恢复错误" class="headerlink" title="转化为不可恢复错误"></a>转化为不可恢复错误</h3><p>使用<code>ESP_ERROR_CHECK</code>处理返回值。</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ESP_ERROR_CHECK(spi_bus_initialize(host, bus_config, dma_chan));</span><br></pre></td></tr></table></figure>

<h2 id="五，严重错误"><a href="#五，严重错误" class="headerlink" title="五，严重错误"></a>五，严重错误</h2><p>以下情况为不可恢复的严重错误，程序会中断重启。</p>
<ul>
<li><p>CPU 异常：非法指令，加载/存储时的内存对齐错误，加载/存储时的访问权限错误，双重异常。</p>
</li>
<li><p>系统级检查错误：</p>
<p>  中断看门狗 超时</p>
<p>  任务看门狗 超时（只有开启 CONFIG_ESP_TASK_WDT_PANIC 后才会触发严重错误）</p>
<p>  高速缓存访问错误</p>
<p>  内存保护故障</p>
<p>  掉电检测事件</p>
<p>  堆栈溢出</p>
<p>  堆栈粉碎保护检查</p>
<p>  堆完整性检查</p>
<p>  未定义行为清理器 (UBSAN) 检查</p>
</li>
<li><p>使用 assert、configASSERT 等类似的宏断言失败。</p>
</li>
</ul>
<p><a target="_blank" rel="noopener" href="https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32s3/api-guides/fatal-errors.html">官方文档</a>给出了参考解决，这里先待补，等以后接触后继续。</p>

        </div>
        
<blockquote class="copyright">
    <p><strong>本文链接 : </strong><a class="permalink" href="https://lostacnet.top/post/42118/">https://lostacnet.top/post/42118/</a></p>
    <p><strong>This article is available under <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank" rel="noopener noreferrer">Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)</a> License  转载请注明出处</strong></p>
</blockquote>


    </article>
    
    <section id="comments">
        
    </section>


    

</main>


<aside style="" id="sidebar" class="aside aside-fixture">
    <div class="toc-sidebar">
        <nav id="toc" class="article-toc">
            <h3 class="toc-title">文章目录</h3>
            <ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#ESP-IDF%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86"><span class="toc-number">1.</span> <span class="toc-text">ESP-IDF学习笔记-错误处理</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%B8%80%EF%BC%8C%E9%94%99%E8%AF%AF%E7%9A%84%E5%88%86%E7%B1%BB"><span class="toc-number">1.1.</span> <span class="toc-text">一，错误的分类</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%BA%8C%EF%BC%8C%E9%94%99%E8%AF%AF%E7%A0%81%E4%B8%8E%E9%94%99%E8%AF%AF%E6%B6%88%E6%81%AF"><span class="toc-number">1.2.</span> <span class="toc-text">二，错误码与错误消息</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%B8%89%EF%BC%8C%E5%B8%B8%E7%94%A8%E5%AE%8F"><span class="toc-number">1.3.</span> <span class="toc-text">三，常用宏</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%9B%9B%EF%BC%8C%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86"><span class="toc-number">1.4.</span> <span class="toc-text">四，错误处理</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%A0%B9%E6%8D%AE%E9%94%99%E8%AF%AF%E7%A0%81%E6%81%A2%E5%A4%8D"><span class="toc-number">1.4.1.</span> <span class="toc-text">根据错误码恢复</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%BD%AC%E5%8C%96%E4%B8%BA%E4%B8%8D%E5%8F%AF%E6%81%A2%E5%A4%8D%E9%94%99%E8%AF%AF"><span class="toc-number">1.4.2.</span> <span class="toc-text">转化为不可恢复错误</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%BA%94%EF%BC%8C%E4%B8%A5%E9%87%8D%E9%94%99%E8%AF%AF"><span class="toc-number">1.5.</span> <span class="toc-text">五，严重错误</span></a></li></ol></li></ol>
        </nav>
    </div>
</aside>





        </section>
        <footer class="hidden lg:block fixed bottom-0 left-0 sm:w-1/12 lg:w-1/6 bg-gray-100 z-40">
    
    <div class="footer-social-links">
        
            <a target="_blank" rel="noopener" href="https://github.com/LOStacNet">
                <i class="iconfont icon-github"></i>
            </a>
        
            <a target="_blank" rel="noopener" href="https://gitee.com/LOStacNet">
                <i class="iconfont icon-project"></i>
            </a>
        
    </div>
    
    
</footer>

        <div id="mask" class="hidden mask fixed inset-0 bg-gray-900 opacity-75 z-40"></div>
        <div id="search-view-container" class="hidden shadow-xl"></div>
        
<script src="/js/dom-event.min.js"></script>



<script src="/js/local-search.min.js"></script>



    <script src="//cdn.jsdelivr.net/npm/lightgallery.js@1.1.3/dist/js/lightgallery.min.js"></script>
    
<script src="/js/light-gallery.min.js"></script>






    </body>
</html>
